#[derive(Debug)]
pub enum ByteCode {
    // local variable
    LoadConst(u8, u16),
    LoadNil(u8, u8),
    LoadBool(u8, bool),
    LoadInt(u8, i16),
    Move(u8, u8),

    // upvalues
    GetUpvalue(u8, u8),
    SetUpvalue(u8, u8),
    SetUpvalueConst(u8, u8),
    Close(u8),

    // table
    NewTable(u8, u8, u8),
    SetTable(u8, u8, u8),
    SetField(u8, u8, u8),
    SetInt(u8, u8, u8),
    SetTableConst(u8, u8, u8),
    SetFieldConst(u8, u8, u8),
    SetIntConst(u8, u8, u8),
    SetList(u8, u8),
    GetTable(u8, u8, u8),
    GetField(u8, u8, u8),
    GetInt(u8, u8, u8),
    GetFieldSelf(u8, u8, u8),

    // upvalue table, covers global variables
    SetUpField(u8, u8, u8),
    SetUpFieldConst(u8, u8, u8),
    GetUpField(u8, u8, u8),

    // condition structures
    Jump(i16),
    TestAndJump(u8, i16),
    TestOrJump(u8, i16),
    TestAndSetJump(u8, u8, u8),
    TestOrSetJump(u8, u8, u8),

    // for-loop
    ForPrepare(u8, u16),
    ForLoop(u8, u16),
    ForCallLoop(u8, u8, u8),

    // function call
    Closure(u8, u16),
    Call(u8, u8, u8),
    CallSet(u8, u8, u8),
    TailCall(u8, u8),
    Return0,
    Return(u8, u8),
    VarArgs(u8, u8),

    // unops
    Neg(u8, u8),
    Not(u8, u8),
    BitNot(u8, u8),
    Len(u8, u8),

    // binops
    Add(u8, u8, u8),
    AddConst(u8, u8, u8),
    AddInt(u8, u8, u8),
    Sub(u8, u8, u8),
    SubInt(u8, u8, u8),
    SubConst(u8, u8, u8),
    Mul(u8, u8, u8),
    MulInt(u8, u8, u8),
    MulConst(u8, u8, u8),
    Mod(u8, u8, u8),
    ModInt(u8, u8, u8),
    ModConst(u8, u8, u8),
    Div(u8, u8, u8),
    DivInt(u8, u8, u8),
    DivConst(u8, u8, u8),
    Idiv(u8, u8, u8),
    IdivInt(u8, u8, u8),
    IdivConst(u8, u8, u8),
    Pow(u8, u8, u8),
    PowInt(u8, u8, u8),
    PowConst(u8, u8, u8),
    BitAnd(u8, u8, u8),
    BitAndInt(u8, u8, u8),
    BitAndConst(u8, u8, u8),
    BitXor(u8, u8, u8),
    BitXorInt(u8, u8, u8),
    BitXorConst(u8, u8, u8),
    BitOr(u8, u8, u8),
    BitOrInt(u8, u8, u8),
    BitOrConst(u8, u8, u8),
    ShiftL(u8, u8, u8),
    ShiftLInt(u8, u8, u8),
    ShiftLConst(u8, u8, u8),
    ShiftR(u8, u8, u8),
    ShiftRInt(u8, u8, u8),
    ShiftRConst(u8, u8, u8),

    Equal(u8, u8, bool),
    EqualInt(u8, u8, bool),
    EqualConst(u8, u8, bool),
    NotEq(u8, u8, bool),
    NotEqInt(u8, u8, bool),
    NotEqConst(u8, u8, bool),
    LesEq(u8, u8, bool),
    LesEqInt(u8, u8, bool),
    LesEqConst(u8, u8, bool),
    GreEq(u8, u8, bool),
    GreEqInt(u8, u8, bool),
    GreEqConst(u8, u8, bool),
    Less(u8, u8, bool),
    LessInt(u8, u8, bool),
    LessConst(u8, u8, bool),
    Greater(u8, u8, bool),
    GreaterInt(u8, u8, bool),
    GreaterConst(u8, u8, bool),

    SetFalseSkip(u8),

    Concat(u8, u8, u8),
}
